package com.tang.crm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tang.crm.dto.CustomerServeDto;
import com.tang.crm.entity.Customer;
import com.tang.crm.entity.CustomerServe;
import com.tang.crm.enums.CustomerServeStatus;
import com.tang.crm.enums.StateStatus;
import com.tang.crm.mapper.CustomerMapper;
import com.tang.crm.mapper.CustomerServeMapper;
import com.tang.crm.service.CustomerServeService;
import com.tang.crm.utils.AssertUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class CustomerServeServiceImpl extends ServiceImpl<CustomerServeMapper, CustomerServe> implements CustomerServeService {

    @Autowired
    private CustomerServeMapper customerServeMapper;

    @Autowired
    private CustomerMapper customerMapper;

    /**
     * 多条件分页查询服务数据列表
     * @param customerServeDto
     * @return
     */
    @Override
    public Map<String, Object> selectByParams(CustomerServeDto customerServeDto) {
        Map<String, Object> map = new HashMap<>();
        Page<CustomerServe> page = new Page<>(customerServeDto.getPage(), customerServeDto.getLimit());
        IPage<Map<String, Object>> mapIPage = customerServeMapper.selectAllByParams(page, customerServeDto);
        map.put("code", 0);
        map.put("msg", "");
        map.put("count", mapIPage.getTotal());
        map.put("data", mapIPage.getRecords());
        return map;
    }

    /**
     * 添加服务操作
     *  1. 参数校验
     *      客户名 customer
     *          非空，客户表中存在客户记录
     *      服务类型 serveType
     *          非空
     *      服务请求内容  serviceRequest
     *          非空
     *  2. 设置参数的默认值
     *      服务状态
     *          服务创建状态  fw_001
     *      是否有效
     *      创建时间
     *      更新时间
     *      创建人 createPeople
     *          （前端页面中通过cookie获取，传递到后台）
     *  2. 执行添加操作，判断受影响的行数
     * @param customerServe
     */
    @Override
    public void addCustomerServe(CustomerServe customerServe) {
        /* 1.参数校验 */
        checkParams(customerServe.getCustomer(), customerServe.getServeType(), customerServe.getServiceRequest());

        /* 2.设置参数的默认值 */
        //  服务状态    服务创建状态  fw_001
        customerServe.setState(CustomerServeStatus.CREATED.getState());
        customerServe.setIsValid(1);
        customerServe.setCreateDate(new Date());
        customerServe.setUpdateDate(new Date());

        /* 3.执行添加操作，判断受影响的行数 */
        AssertUtil.isTrue(customerServeMapper.insert(customerServe) != 1, "添加服务失败");
    }

    /**
     * 服务分配/服务处理/服务反馈
     *  1. 参数校验与设置参数的默认值
     *      客户服务ID
     *          非空，记录必须存在
     *      客户服务状态
     *          如果服务状态为 服务分配状态 fw_002
     *              分配人
     *                  非空，分配用户记录存在
     *              分配时间
     *                  系统当前时间
     *              更新时间
     *                  系统当前时间
     *
     *          如果服务状态为 服务处理状态 fw_003
     *              服务处理内容
     *                  非空
     *              服务处理时间
     *                  系统当前时间
     *              更新时间
     *                  系统当前时间
     *
     *          如果服务状态是 服务反馈状态  fw_004
     *              服务反馈内容
     *                  非空
     *              服务满意度
     *                  非空
     *              更新时间
     *                  系统当前时间
     *              服务状态
     *                  设置为 服务归档状态 fw_005
     *
     * 2. 执行更新操作，判断受影响的行数
     * @param customerServe
     */
    @Override
    public void updateCustomerServeState(CustomerServe customerServe) {
        /* 1.参数校验与设置参数的默认值 */
        // 客户服务ID  非空且记录存在
        AssertUtil.isTrue(customerServe.getId() == null
                || customerServeMapper.selectById(customerServe.getId()) == null, "待更新的服务记录不存在");
        // 判断客户服务的服务状态
        if (CustomerServeStatus.ASSIGNED.getState().equals(customerServe.getState())) {
            // 服务分配操作
            // 分配人 非空，分配用户记录存在
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getAssigner()), "待分配用户不能为空");
            AssertUtil.isTrue(customerMapper.selectCustomerByName(customerServe.getCustomer()) == null, "待分配用户不存在");
            // 分配时间 系统当前时间
            customerServe.setAssignTime(new Date());
        } else if (CustomerServeStatus.PROCED.getState().equals(customerServe.getState())) {
            // 服务处理操作
            // 服务处理内容   非空
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServiceProce()), "服务处理内容不能为空");
            // 服务处理时间 系统当前时间
            customerServe.setServiceProceTime(new Date());
        } else if (CustomerServeStatus.FEED_BACK.getState().equals(customerServe.getState())) {
            // 服务反馈操作
            // 服务反馈内容 非空
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getServiceProceResult()), "服务反馈内容不能为空");
            // 服务满意度 非空
            AssertUtil.isTrue(StringUtils.isBlank(customerServe.getMyd()), "请选择满意度");
            // 服务状态      设置为 服务归档状态 fw_005
            customerServe.setState(CustomerServeStatus.ARCHIVED.getState());
        }
        // 更新时间 系统当前时间
        customerServe.setUpdateDate(new Date());

        /* 2.执行更新操作，判断受影响的行数 */
        AssertUtil.isTrue(customerServeMapper.updateById(customerServe), "服务更新失败");
    }


    /**
     * 参数校验：
     *   1.客户名 customer
     *       非空，客户表中存在客户记录
     *   2.服务类型 serveType
     *       非空
     *   3.服务请求内容  serviceRequest
     *       非空
     * @param customer
     * @param serveType
     * @param serviceRequest
     */
    public void checkParams(String customer, String serveType, String serviceRequest) {
        // 客户名 customer 非空
        AssertUtil.isTrue(StringUtils.isBlank(customer), "客户名不能为空");
        // 客户名 customer     客户表中存在客户记录
        AssertUtil.isTrue(customerMapper.selectCustomerByName(customer) == null, "客户不存在");
        // 服务类型 serveType  非空
        AssertUtil.isTrue(StringUtils.isBlank(serveType), "请选择服务类型");
        // 服务请求内容  serviceRequest  非空
        AssertUtil.isTrue(StringUtils.isBlank(serviceRequest), "服务请求内容不能为空");
    }
}
